# 렉시컬 환경(Lexical Environment)

= 내부 숨김 연관 객체(Internal Hidden Associated Object)

Q: 렉시컬 이름인 이유? "사전의" "어휘의"

  • 실행중인 함수
  • 코드 블록 {...}
  • 스크립트 전체

는 내부 숨김 연관 객체를 갖는다.

# 렉시컬 환경 객체의 구성

# 1. 환경 레코드(Environment Record)

  • 모든 지역변수를 프로퍼티로 저장하고 있는 객체
  • this 값과 같은 기타 정보도 저장된다.
  • 변수는 특수 내부 객체인 환경 레코드의 프로퍼티일 뿐이다.
  • 변수를 가져오거나 변경하는 것 = 환경 레코드의 프로퍼티를 가져오거나 변경하는 것.

# 2. 외부 렉시컬 환경(Outer Lexical Environment)에 대한 참조

  • 외부 코드(외부 렉시컬 환경)와 연결됨.

# 전역 렉시컬 환경(Global Lexical Environment)

스크립트 전체와 관련된 렉시컬 환경

  • let phrase = 'hello';
  • lexical environment : phrase: 'hello'
  • outer Lexical Environment 참조: null
    • 전역 렉시컬 환경은 외부 참조를 갖지 않는다.

# let 변수의 렉시컬 환경

                          Lexical Environment              outer Lexical Env
1. execution ------------>  phrase: <uninitialized>
2. let phrase ----------->  phrase: undefined
3. phrase = 'hello' ----->  phrase: 'hello'            ---> null
4. phrase = 'bye' ------->  phrase: 'bye'
1
2
3
4
5

스크립트가 시작

  • 스크립트 내 선언된 변수 전체가 렉시컬 환경에 올라간다.
  • 변수의 상태는 특수 내부상태(Special Internal State)인 'uninitialized'
    • JS 엔진은 uninitialized 상태의 변수를 인지하지만, let 을 만나기 전까지는 이 변수를 참조할 수 없다.

렉시컬 환경은 명세서에만 존재한다.
- 자바스크립트가 어떻게 동작하는지 설명하는데 쓰이는 이론상의 객체
- 코드를 사용해 직접 렉시컬 환경을 얻거나 조작하는 것은 불가능

# 함수 선언문의 렉시컬 환경

  • 일반 변수와는 달리 바로 초기화 된다.
  • 렉시컬 환경이 만들어지는 즉시 사용 가능
  • 선언 되기전에도 함수를 사용할 수 있는 이유.
                           Lexical Environment
execution start -------->  phrase: <uninitialized>
                           say: function
let phrase = 'hello'                ...
function say(name) {                ...
    alert(...)                      ...
}
1
2
3
4
5
6
7

# 내부와 외부 렉시컬 환경

함수를 호출해 실행하면 새로운 렉시컬 환경이 자동으로 만들어 진다.

  • 매개변수
  • 함수의 지역변수
let phrase = 'hello';
                                           Lexical Environment          outer Lexical Environment
function say(name) {                  ---  
    alert(`${phrase}`, ${name}`);       |-  name: "John"    -------->   say: function                    --------> null
}                                     ---                               phrase: 'hello'

say('John');
1
2
3
4
5
6
7

함수가 호출중인 동안, 호출중인 함수를 위한 렉시컬 환경 2가지

  • 내부 렉시컬 환경
  • 내부 렉시컬 환경이 가리키는 외부(전역) 렉시컬 환경

# 더 보면 좋은글

# Reference

  • KoJavaScriptInfo